package com.chenj.service.impl;

import com.chenj.entity.User;
import com.chenj.service.EhcacheService;
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.CachePut;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Service;

@Service
public class EhcacheServiceImpl implements EhcacheService {

    // value：缓存位置名称，不能为空，如果使用EHCache，就是ehcache.xml中声明的cache的name, 指明将值缓存到哪个Cache中
    // @Cacheable
    // 表明所修饰的方法是可以缓存的：当第一次调用这个方法时，它的结果会被缓存下来，在缓存的有效时间内，以后访问这个方法都直接返回缓存结果，不再执行方法中的代码段。
    /*
     * 默认情况下，缓存的 key 就是方法的参数，缓存的 value 就是方法的返回值
     * key相当于缓存时(键值对的)键,比如说user:1000,这是缓存的是键user:1000
     * key="'user:' + #userId"
     *
     *  //3,存入元素
     *  // 场景1: 存入字符串
     *  Element element = new Element("key1", "value1");
     *
     *  helloWorldCache.put(element);
     *  //4,取出来
     *  Element value = helloWorldCache.get("key1");
     */
    // 如果说不指定key,key就是方法的参数,userId=1000,key=1000
    // ,返回值就是方法的返回值,User类型的数据
    @Cacheable(value="UserCache", key="'user:' + #userId")//user:1000
//     @Cacheable(value="UserCache", keyGenerator="selfKeyGenerate")//user:1000
    @Override
    public User findById(String userId) {
        System.out.println("execute findById....");
        return new User("1000","Jack");
    }

    // 将缓存保存进UserCache中，并当参数userId的长度小于12时才保存进缓存，
    @Cacheable(value="UserCache", condition="#userId.length() < 12")
    public boolean isReserved(String userId) {
        System.out.println("UserCache:"+userId);
        return false;
    }


    @CachePut(value="UserCache", key="#key")
    public String refreshData(String key) {
        // 与@Cacheable不同，@CachePut不仅会缓存方法的结果，还会执行方法的代码段。它支持的属性和用法都与@Cacheable一致。
        System.out.println("模拟从数据库中加载数据");
        return key + "::" + String.valueOf(Math.round(Math.random()*1000000));
    }

    //清除掉UserCache中某个指定key的缓存
    @CacheEvict(value="UserCache",key="'user:' + #userId")
    public void removeUser(String userId) {
        System.out.println("UserCache:"+userId);
    }

    //allEntries：true表示清除value中的全部缓存，默认为false
    //清除掉UserCache中全部的缓存
    @CacheEvict(value="UserCache", allEntries=true)
    public void removeAllUser() {
        System.out.println("UserCache delete all");
    }


}
